﻿
using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;
using MotoGame.Estados;
using MotoGame;
using MotoGame.Jogos.Estados.Fases.Moto;
using Trunk.Jogo.Core;

namespace Trunk.Jogo.Estados.Fases
{
    /// <summary>
    /// A primeira fase do jogo
    /// </summary>
    class Fase1:EstadoBase
    {
        Moto moto1;         //moto azul//
        
        Song musica;
        
        GameWindow window;

        //lista de camadas
        List<ParallaxLayer> layers;

        //velocidade de movimentação da camada principal
        float velocidadePrincipal = 100f;
        //velocidade da camada de montanhas
        float velocidadeMontanhas = 0.3f;
        //velocidade da camada da plataforma
        float velocidadePlataforma = 0.85f;
        //velocidade nuvens
        float velocidadeNuvens = 0.1f;

        bool firstTimeMusic = true;

        Colisao HitPlataforma;

        public Fase1(ContentManager Content, GameWindow Window)
            :base(Content, Window)
       
        {
            this.window = Window;

            moto1 = new Moto(Content, Window, "moto1");
               
            musica = Content.Load<Song>("Fases/Fase1/Sounds/Musics/music");

            HitPlataforma = new Colisao(Content, window, "moto1", "Fases/Fase1/Texturas/plataforma1Colisao");

            this.layers = new List<ParallaxLayer>();

            ParallaxLayer nuvens = new ParallaxLayer(velocidadePrincipal * velocidadeNuvens, 1f);
            //cria a camada de montanhas
            ParallaxLayer montanhas = new ParallaxLayer(velocidadePrincipal * velocidadeMontanhas, 1f);
            //cria a camada de grama
            ParallaxLayer plataforma1Colisao = new ParallaxLayer(velocidadePrincipal * velocidadePlataforma, 1f);
            ParallaxLayer plataforma = new ParallaxLayer(velocidadePrincipal * velocidadePlataforma, 1f);
            //cria a camada principal (principal)
            ParallaxLayer principal = new ParallaxLayer(velocidadePrincipal, 1f);

            //adiciona as camadas
            this.layers.Add(nuvens);
            this.layers.Add(montanhas);
            this.layers.Add(plataforma1Colisao);
            this.layers.Add(plataforma);
            this.layers.Add(principal);

            //carrega as imagens das camadas
            this.layers[0].LoadContent(Content, @"Fases/Fase1/Texturas/nuvens");
            this.layers[1].LoadContent(Content, @"Fases/Fase1/Texturas/montanhas");
            this.layers[2].LoadContent(Content, @"Fases/Fase1/Texturas/PlataformaOndulada");
            this.layers[3].LoadContent(Content, @"Fases/Fase1/Texturas/plataforma1Colisao");
            this.layers[4].LoadContent(Content, @"Fases/Fase1/Texturas/principal");
        }

        public override void Update(GameTime gameTime)
        {
            if (firstTimeMusic)
            {
                MediaPlayer.Play(musica);
                firstTimeMusic = false;
                
            }

            #region Updates Classes
            moto1.Update(gameTime);

            if (HitPlataforma.Update(gameTime, moto1.posicao, layers[2].Posicao, new Vector2(moto1.textura.Width, moto1.textura.Height), new Vector2(layers[2].textura.Width, layers[2].textura.Height)))
            {
                window.Title = "bati";
            }
            else
            {
                window.Title = "não bati";
            }

            

            #region Paralax
            //Paralax para direita//
            if (moto1.posicao.X > window.ClientBounds.Width * 2/3)
            {
                Vector2 aux = new Vector2(window.ClientBounds.Width * 2 / 3, moto1.posicao.Y);

                moto1.posicao = aux;

                aux = new Vector2(moto1.velocidadeX, 0);

                foreach (ParallaxLayer layer in this.layers)
                {
                    layer.Update(gameTime, aux);
                }
            }

            //Paralax para esdquerda//
            if (moto1.posicao.X < window.ClientBounds.Width * 1/6)
            {
                if (layers[4].Posicao.X < 0)
                {

                    Vector2 aux = new Vector2(window.ClientBounds.Width * 1 / 6, moto1.posicao.Y);

                    moto1.posicao = aux;

                    aux = new Vector2(moto1.velocidadeX, 0);

                    foreach (ParallaxLayer layer in this.layers)
                    {
                        layer.Update(gameTime, aux);
                    }
                }
            }
            #endregion

            #endregion

            if (HitPlataforma.hit)
            {
                moto1.posicao.Y = (layers[2].textura.Height / 2) - (moto1.textura.Height / 7);
            }

        }

        public override void Draw(GameTime gameTime, SpriteBatch spriteBatch)
        {
            //desenha as camadas na tela
            foreach (ParallaxLayer layer in this.layers)
            {
                layer.Draw(spriteBatch);
            }

            layers[2].Draw(spriteBatch);

            moto1.Draw(gameTime, spriteBatch);

            spriteBatch.DrawString(Game1.arial, "Pontos: " + moto1.pontos + "           " + "Turbo: " + moto1.limiteTurbo, new Vector2(10, 10), Color.Red);

        }

    }
}

